package com.zhu.solution.arrayQuestion;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

/**
 * 两个数组的交集 II
 *
 * 给你两个整数数组 nums1 和 nums2 ，请你以数组形式返回两数组的交集。
 * 返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致（如果出现次数不一致，则考虑取较小值）。可以不考虑输出结果的顺序。
 *
 */
public class Solution_6 {

    public static void main(String[] args) {
        int[] nums1 = {4,9,5};
        int[] nums2 = {9,4,9,8,4};
        System.out.println(Arrays.toString(new Solution_6().intersect(nums1,nums2)));
    }

    public int[] intersect(int[] nums1, int[] nums2) {
        if (nums1 == null || nums2 == null){
            return null;
        }
        if (nums1.length == 0 || nums2.length == 0){
            return null;
        }
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        ArrayList<Integer> intersection = new ArrayList<>();
        int index_1 = 0;
        int index_2 = 0;

        while (index_1<nums1.length && index_2<nums2.length){
            if (nums1[index_1] < nums2[index_2]){
                index_1++;
            }else if (nums1[index_1] > nums2[index_2]){
                index_2++;
            }else {
                intersection.add(nums1[index_1]);
                index_1++;
                index_2++;
            }
        }

//        Integer[] intersection1 = intersection.toArray(new Integer[0]);
//        int[] intersection1 =  Arrays.stream(intersection.toArray(new Integer[0])).mapToInt(Integer::valueOf).toArray();
        int[] intersection1 = new int[intersection.size()];
        for(int i=0;i<intersection.size();i++){
            intersection1[i]=(int) intersection.get(i);
        }
        return intersection1;
    }

    //应用map.getOrDefault
    //Map.getOrDefault(Object key, V defaultValue)方法的作用是：
    //  （1）当Map集合中存在这个key时，就使用这个key值,(若是数值型可以在此基础上进行运算)
    //  （2）如果没有就使用默认值defaultValue。
    public int[] intersect_2(int[] nums1, int[] nums2) {
        HashMap<Integer, Integer> map = new HashMap<>();
        ArrayList<Integer> list = new ArrayList<>();

        //先把数组nums1的所有元素都存放到map中，其中key是数组中
        //的元素，value是这个元素出现在数组中的次数
        for (int i = 0; i < nums1.length; i++) {
            map.put(nums1[i], map.getOrDefault(nums1[i], 0) + 1);
        }

        //然后再遍历nums2数组，查看map中是否包含nums2的元素，如果包含，
        //就把当前值加入到集合list中，然后再把对应的value值减1。
        for (int i = 0; i < nums2.length; i++) {
            if (map.getOrDefault(nums2[i], 0) > 0) {
                list.add(nums2[i]);
                map.put(nums2[i], map.get(nums2[i]) - 1);
            }
        }

        //把集合list转化为数组
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }
}
